package org.example.execute;

public class Test1 {

	
	
	public int add(int a,int b) {
		int c = a + b;
		return a+b+c;
		
		//slot           
		//0--this
		//1--a = 1
		//2--b = 2
		//3--c = 3
		
		//操作数栈
		//6
		//c=3
		//3
		//b=2
		//a=1
		//3  -- c=3
		//b=2
		//a=1
	}
	
	public static void main(String[] args) {
//		Test1 t = new Test1();
		
//		int ret = t.add(1, 2);
		
//		System.out.println("ret==="+ret);
//		slot是复用的，以节省栈帧的空间，这种设计可能会影响到系统垃圾收集的行为
		{
			byte[] bs = new byte[1*1024*1024];
			byte[] bs2 = new byte[1*1024*1024];

			// 解决slot复用的问题，可以直接使用bs=null;的方法，直接是堆中对象失去引用，被垃圾回收！这也是代码中可优化的点
			bs2 = null;
		}
		int a = 5;  // 以上bs变量在块中已经结束，单还是存在槽1中，声明a变量后，1槽指向a变量，bs引用的对象将会被垃圾回收
		//slot
		//0--args
		//1--a      (bs ------)  堆的空间，放着2M的数据
		
		System.gc();
		
		System.out.println("totalMemory==="+Runtime.getRuntime().totalMemory()/1024.0/1024.0);
		System.out.println("freeMemory==="+Runtime.getRuntime().freeMemory()/1024.0/1024.0);
		System.out.println("maxMemory==="+Runtime.getRuntime().maxMemory()/1024.0/1024.0);
	}
	
	
}
